﻿using System;
using System.Collections.Generic;
using System.Web.Mvc;
using ControleRepresentante.Logic;
using ControleRepresentante.Logic.Models;
using ControleRepresentante.Logic.Repositories;
using ControleRepresentante.Logic.Statistics;
using WebSite.Controllers.ControllerExtensions;
using WebSite.ViewModels.DetailsViewModels;
using WebSite.ViewModels.EditViewModels;
using WebSite.ViewModels.IndexViewModels;

namespace WebSite.Controllers
{
    public class ProdutoController : CRUDControllerBase<IProdutoRepository, Produto, ProdutoStatistics>
    {
        public ProdutoController(IRepositoryProvider repositoryProvider, ISessionConfiguration sessionConfiguration, IControllerExtensionProvider controllerExtensionProvider) 
            : base(repositoryProvider, sessionConfiguration, controllerExtensionProvider)
        {
        }

        protected override IIndexViewModel GetIndexViewModel(ProdutoStatistics statistics)
        {
            bool canViewPedido = HasPermission(ControleRepresentante.Logic.Models.Area.Pedidos, Operacao.View);
            return new ProdutoIndexViewModel(canViewPedido, statistics);
        }

        protected override EditViewModel GetEditViewModel(Produto model, bool isNew)
        {
            throw new System.NotImplementedException();
        }

        protected override DetailsViewModel GetDetailsViewModel(Produto model)
        {
            throw new System.NotImplementedException();
        }

        protected override bool CanDelete(Produto model, out string message)
        {
            message = null;
            return false;
        }

        protected override void RegisterIndexColumns(IIndexColumnsProvider indexColumnsProvider)
        {
            base.RegisterIndexColumns(indexColumnsProvider);

            List<IndexColumn> defaultColumns = new List<IndexColumn>
            {
                indexColumnsProvider.RegisterColumn("Codigo", ProdutoIndexColumns.Codigo, true),
                indexColumnsProvider.RegisterColumn("Descricao", ProdutoIndexColumns.Descricao, true),
                indexColumnsProvider.RegisterColumn("Quantidade", ProdutoIndexColumns.Quantidade, true)
            };

            if (HasPermission(ControleRepresentante.Logic.Models.Area.Pedidos, Operacao.View))
            {
                defaultColumns.Add(indexColumnsProvider.RegisterColumn("Pedidos", ProdutoIndexColumns.SearchPedidosByProduto, true));
            }

            indexColumnsProvider.SetDefaultColumns(defaultColumns.ToArray());

        }

        public ActionResult Search(int? numero, string vendedorIds, string cliente, string fabricaIds, string transportadoraIds, DateTime? de, DateTime? ate, string codigo, string descricao, FormCollection formCollection)
        {
            ProdutoStatistics statistics;

            EnsureHasPermission(Operacao.View);

            formCollection.Add(Request.QueryString);

            Dictionary<Guid, string> vendedores = ParseIds<IVendedorRepository, Vendedor, StatisticsBase>(vendedorIds, x => x.Nome);
            Dictionary<Guid, string> fabricas = ParseIds<IFabricaRepository, Fabrica, StatisticsBase>(fabricaIds, x => x.Nome);
            Dictionary<Guid, string> transportadoras = ParseIds<ITransportadoraRepository, Transportadora, StatisticsBase>(transportadoraIds, x => x.Nome);
            IEnumerable<Produto> models = Repository.GetModels(numero, vendedores.Keys, cliente, fabricas.Keys, transportadoras.Keys, de, ate, codigo, descricao, out statistics, GetPage());

            return Index(models, statistics, formCollection, x =>
            {
                ProdutoIndexViewModel produtoIndexViewModel = (ProdutoIndexViewModel)x;
                produtoIndexViewModel.VendedorBusca = vendedores;
                produtoIndexViewModel.FabricaBusca = fabricas;
                produtoIndexViewModel.TransportadoraBusca = transportadoras;
                produtoIndexViewModel.NumeroBuscaValue = numero;
                produtoIndexViewModel.VendedorBuscaValue = vendedorIds;
                produtoIndexViewModel.ClienteBuscaValue = cliente;
                produtoIndexViewModel.FabricaBuscaValue = fabricaIds;
                produtoIndexViewModel.TransportadoraBuscaValue = transportadoraIds;
                produtoIndexViewModel.DeBuscaValue = de;
                produtoIndexViewModel.AteBuscaValue = ate;
                produtoIndexViewModel.CodigoBuscaValue = codigo;
                produtoIndexViewModel.DescricaoBuscaValue = descricao;
            });
        }

        protected override Area? Area
        {
            get { return ControleRepresentante.Logic.Models.Area.Produto; }
        }
    }
}